#ifndef GLIB_MATRIX_HY
#define GLIB_MATRIX_HY


#include "gMatrix.h"
#include "common.h"

class CGLIBMatrix
{
public:
	float m[4][4];

public:
	inline CGLIBMatrix()
	{
		memset(m, 0, sizeof(m));
	}

	inline ~CGLIBMatrix()
	{}

	inline void MultMatrix(CGLIBMatrix& mat)
	{
		float tmp[4][4];
		memcpy(tmp, m, sizeof(m));

		m[0][0] = tmp[0][0]*mat.m[0][0] + tmp[0][1]*mat.m[1][0] + tmp[0][2]*mat.m[2][0] + tmp[0][3]*mat.m[3][0];
		m[0][1] = tmp[0][0]*mat.m[0][1] + tmp[0][1]*mat.m[1][1] + tmp[0][2]*mat.m[2][1] + tmp[0][3]*mat.m[3][1];
		m[0][2] = tmp[0][0]*mat.m[0][2] + tmp[0][1]*mat.m[1][2] + tmp[0][2]*mat.m[2][2] + tmp[0][3]*mat.m[3][2];
		m[0][3] = tmp[0][0]*mat.m[0][3] + tmp[0][1]*mat.m[1][3] + tmp[0][2]*mat.m[2][3] + tmp[0][3]*mat.m[3][3];

		m[1][0] = tmp[1][0]*mat.m[0][0] + tmp[1][1]*mat.m[1][0] + tmp[1][2]*mat.m[2][0] + tmp[1][3]*mat.m[3][0];
		m[1][1] = tmp[1][0]*mat.m[0][1] + tmp[1][1]*mat.m[1][1] + tmp[1][2]*mat.m[2][1] + tmp[1][3]*mat.m[3][1];
		m[1][2] = tmp[1][0]*mat.m[0][2] + tmp[1][1]*mat.m[1][2] + tmp[1][2]*mat.m[2][2] + tmp[1][3]*mat.m[3][2];
		m[1][3] = tmp[1][0]*mat.m[0][3] + tmp[1][1]*mat.m[1][3] + tmp[1][2]*mat.m[2][3] + tmp[1][3]*mat.m[3][3];

		m[2][0] = tmp[2][0]*mat.m[0][0] + tmp[2][1]*mat.m[1][0] + tmp[2][2]*mat.m[2][0] + tmp[2][3]*mat.m[3][0];
		m[2][1] = tmp[2][0]*mat.m[0][1] + tmp[2][1]*mat.m[1][1] + tmp[2][2]*mat.m[2][1] + tmp[2][3]*mat.m[3][1];
		m[2][2] = tmp[2][0]*mat.m[0][2] + tmp[2][1]*mat.m[1][2] + tmp[2][2]*mat.m[2][2] + tmp[2][3]*mat.m[3][2];
		m[2][3] = tmp[2][0]*mat.m[0][3] + tmp[2][1]*mat.m[1][3] + tmp[2][2]*mat.m[2][3] + tmp[2][3]*mat.m[3][3];

		m[3][0] = tmp[3][0]*mat.m[0][0] + tmp[3][1]*mat.m[1][0] + tmp[3][2]*mat.m[2][0] + tmp[3][3]*mat.m[3][0];
		m[3][1] = tmp[3][0]*mat.m[0][1] + tmp[3][1]*mat.m[1][1] + tmp[3][2]*mat.m[2][1] + tmp[3][3]*mat.m[3][1];
		m[3][2] = tmp[3][0]*mat.m[0][2] + tmp[3][1]*mat.m[1][2] + tmp[3][2]*mat.m[2][2] + tmp[3][3]*mat.m[3][2];
		m[3][3] = tmp[3][0]*mat.m[0][3] + tmp[3][1]*mat.m[1][3] + tmp[3][2]*mat.m[2][3] + tmp[3][3]*mat.m[3][3];
	}

	inline void LoadIdentity()
	{
		memset(m, 0, sizeof(m));
		m[0][0] = 1.0;
		m[1][1] = 1.0;
		m[2][2] = 1.0;
		m[3][3] = 1.0;
	}

	inline void SetElement(float val, int row, int col)
	{
		m[row][col] = val;
	}
};

#endif